package com.baizhi.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import java.util.Calendar;
import java.util.Map;

public class JWTUtils {
    //密钥
    private static String TOKEN = "token!Q@W3e4r";
    /**
     * 通过Map形式传入payload信息生成token
     * @param map  传入的payload
     * @return 返回token
     */
    public static String getToken(Map<String,String> map){
        //生成JWT的builder对象
        JWTCreator.Builder builder = JWT.create();
        //通过拉姆达表达式给JWT的第二部分Payload中的内容设置信息，可以设置多个信息
        map.forEach((k,v)->{
            builder.withClaim(k,v);
        });
        //设置过期时间为7天  SECOND：过期时间按秒算，DATE:过期时间按天算
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.DATE,7);
        //设置JWT的过期时间为7天
        builder.withExpiresAt(instance.getTime());
        //设置秘钥，很重要不可泄露 {{Algorithm：算法，signature：签名}}
        //由第一、第二部分和秘钥再通过第一部分指定的算法进行签名
        String token = builder.sign(Algorithm.HMAC256(TOKEN)).toString();
        return token;
    }
    /**
     * 验证token
     * @param token
     * @return
     */
    public static DecodedJWT verify(String token){
        DecodedJWT verify = JWT.require(Algorithm.HMAC256(TOKEN)).build().verify(token);
        /*上面一步，相当于下面的两步
            //创建JWT验证对象{{Verifier：检验器}}  {{verify:证实}} {{Expires：有效期}}
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("token!Q2W#E$R")).build();
            //通过验证对象中的verify验证token是否正确，并返回DecodedJWT对象，内中包含payload的信息
            DecodedJWT decodedJWT = jwtVerifier.verify("token");
        */
        return verify;
    }
}

